package com.sxj.corejava.code07_stream;

import java.util.*;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

/**
 * @author 石小俊
 * @date 2023年12月2023/12/23日 10:43
 */
public class Test01_创建对象 {

    public static void main(String[] args) {
        // Collection体系的集合
        List<Integer> list = Arrays.asList(1, 3, 4, 6, 7, 8);
        Stream<Integer> stream = list.stream();
        // 此时的Stream只是一个对象,并没有终止,因此看不到最终数据
        System.out.println(stream);
        // 如果想要查看Stream中的元素
        // 可以通过foreach终止操作迭代Stream中的元素
        stream.forEach(System.out::println);

        // Map体系集合
        // 无法直接获取对应的stream,需要将Map转换成Set进行获取
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "admin");
        map.put(2, "alice");
        map.put(3, "tom");
        map.put(4, "jack");
        // Map集合想要转换成Stream有几种方式
        // 1.将Map的key存放到Set集合中进行转换
        Stream<Integer> keyStream = map.keySet().stream();
        keyStream.forEach(System.out::println);
        // 将Map的键值对使用Entry的方式存放到Set集合中
        Stream<Map.Entry<Integer, String>> entryStream = map.entrySet().stream();
        entryStream.forEach(System.out::println);

        // 数组类型
        Integer[] arr = {1, 4, 7, 9};
        // 可以通过Arrays工具类进行转换
        Stream<Integer> s1 = Arrays.stream(arr);
        s1.forEach(System.out::println);

        // 可变长参数
        // 通过Stream提供的静态方法进行转换
        Stream<String> s2 = Stream.of("南京", "泰州", "苏州", "扬州", "无锡");
        s2.forEach(System.out::println);

        // 由于可变长参数也属于数组,因此数组也可以通过of方法实现
        String[] arr2 = {"江苏", "浙江", "安徽", "河南", "河北"};
        Stream<String> s3 = Stream.of(arr2);
        s3.forEach(System.out::println);

        // 无限流,将无限个元素添加到Stream中,永不停止
        // 可以使用函数式接口UnaryOperator<T>来实现
        // 该函数式接口默认是后一个值与前一个值一致
        // 接口默认静态方法可以获取到对应的对象
        UnaryOperator<Integer> operator = UnaryOperator.identity();
        // 通过Stream提供的静态方法iterate来获取一个对应的无限流
        // 该方法存在两个参数
        // 参数一:初始值
        // 参数二:后续值如何获取,默认是同一个值
        // 如果不想要永远相同的值,可以不使用默认的实现方法
        // 可以自定义实现
//        Stream<Integer> s4 = Stream.iterate(1,operator);
//        Stream<Integer> s4 = Stream.iterate(1, t -> t + 1);
        Stream<Integer> s4 = Stream.iterate(2, t -> t + 2);
        s4.forEach(System.out::println);
    }

}
